from exts import db
from datetime import datetime, date
from sqlalchemy.dialects.mysql import LONGTEXT

class UserModel(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(200), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)

class EmailCaptchaModel(db.Model):
    __tablename__ = "email_captcha"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(100), nullable=False)
    captcha = db.Column(db.String(100), nullable=False)

class ProjectsModel(db.Model):
    __tablename__ = "projects"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    projectname = db.Column(db.String(100), nullable=False)
    projecttype = db.Column(db.String(100), nullable=False)
    create_time = db.Column(db.Date, default=date.today())
    data_input = db.Column(LONGTEXT)
    data_output = db.Column(LONGTEXT)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    creator = db.relationship("UserModel", backref='projects')

class SiteModel(db.Model):
    __tablename__ = "sites"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    sitename = db.Column(db.String(100), nullable=False)
    create_time = db.Column(db.Date, default=date.today())

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    creator = db.relationship("UserModel", backref='sites')

    # 84个参数字段
    tmax1 = db.Column(db.Numeric(8, 4), default=20.91)
    tmax2 = db.Column(db.Numeric(8, 4), default=21.14)
    tmax3 = db.Column(db.Numeric(8, 4), default=19.57)
    tmax4 = db.Column(db.Numeric(8, 4), default=17.4)
    tmax5 = db.Column(db.Numeric(8, 4), default=14.28)
    tmax6 = db.Column(db.Numeric(8, 4), default=12.33)
    tmax7 = db.Column(db.Numeric(8, 4), default=11.97)
    tmax8 = db.Column(db.Numeric(8, 4), default=12.78)
    tmax9 = db.Column(db.Numeric(8, 4), default=14.45)
    tmax10 = db.Column(db.Numeric(8, 4), default=16.32)
    tmax11 = db.Column(db.Numeric(8, 4), default=17.38)
    tmax12 = db.Column(db.Numeric(8, 4), default=18.94)
    tmin1 = db.Column(db.Numeric(8, 4), default=10.77)
    tmin2 = db.Column(db.Numeric(8, 4), default=11.4)
    tmin3 = db.Column(db.Numeric(8, 4), default=10.03)
    tmin4 = db.Column(db.Numeric(8, 4), default=8.52)
    tmin5 = db.Column(db.Numeric(8, 4), default=6.36)
    tmin6 = db.Column(db.Numeric(8, 4), default=4.4)
    tmin7 = db.Column(db.Numeric(8, 4), default=3.92)
    tmin8 = db.Column(db.Numeric(8, 4), default=4.38)
    tmin9 = db.Column(db.Numeric(8, 4), default=5.63)
    tmin10 = db.Column(db.Numeric(8, 4), default=6.69)
    tmin11 = db.Column(db.Numeric(8, 4), default=8.3)
    tmin12 = db.Column(db.Numeric(8, 4), default=9.59)
    precip1 = db.Column(db.Numeric(8, 4), default=150)
    precip2 = db.Column(db.Numeric(8, 4), default=150)
    precip3 = db.Column(db.Numeric(8, 4), default=150)
    precip4 = db.Column(db.Numeric(8, 4), default=150)
    precip5 = db.Column(db.Numeric(8, 4), default=150)
    precip6 = db.Column(db.Numeric(8, 4), default=150)
    precip7 = db.Column(db.Numeric(8, 4), default=150)
    precip8 = db.Column(db.Numeric(8, 4), default=150)
    precip9 = db.Column(db.Numeric(8, 4), default=150)
    precip10 = db.Column(db.Numeric(8, 4), default=150)
    precip11 = db.Column(db.Numeric(8, 4), default=150)
    precip12 = db.Column(db.Numeric(8, 4), default=150)
    evap1 =  db.Column(db.Numeric(8, 4), default=4.68)
    evap2 = db.Column(db.Numeric(8, 4), default=4.33)
    evap3 = db.Column(db.Numeric(8, 4), default=3.12)
    evap4 = db.Column(db.Numeric(8, 4), default=2.07)
    evap5 = db.Column(db.Numeric(8, 4), default=1.25)
    evap6 = db.Column(db.Numeric(8, 4), default=0.79)
    evap7 = db.Column(db.Numeric(8, 4), default=0.93)
    evap8 = db.Column(db.Numeric(8, 4), default=1.37)
    evap9 = db.Column(db.Numeric(8, 4), default=2.24)
    evap10 = db.Column(db.Numeric(8, 4), default=2.96)
    evap11 = db.Column(db.Numeric(8, 4), default=3.6)
    evap12 = db.Column(db.Numeric(8, 4), default=4.32)
    ra1 = db.Column(db.Numeric(8, 4), default=23.27)
    ra2 = db.Column(db.Numeric(8, 4), default=19.84)
    ra3 = db.Column(db.Numeric(8, 4), default=14.18)
    ra4 = db.Column(db.Numeric(8, 4), default=9.49)
    ra5 = db.Column(db.Numeric(8, 4), default=6.12)
    ra6 = db.Column(db.Numeric(8, 4), default=4.81)
    ra7 = db.Column(db.Numeric(8, 4), default=5.44)
    ra8 = db.Column(db.Numeric(8, 4), default=8.23)
    ra9 = db.Column(db.Numeric(8, 4), default=12.83)
    ra10 = db.Column(db.Numeric(8, 4), default=17.22)
    ra11 = db.Column(db.Numeric(8, 4), default=20.41)
    ra12 = db.Column(db.Numeric(8, 4), default=22.41)
    raind1 = db.Column(db.Numeric(8, 4), default=20)
    raind2 = db.Column(db.Numeric(8, 4), default=20)
    raind3 = db.Column(db.Numeric(8, 4), default=20)
    raind4 = db.Column(db.Numeric(8, 4), default=20)
    raind5 = db.Column(db.Numeric(8, 4), default=20)
    raind6 = db.Column(db.Numeric(8, 4), default=20)
    raind7 = db.Column(db.Numeric(8, 4), default=20)
    raind8 = db.Column(db.Numeric(8, 4), default=20)
    raind9 = db.Column(db.Numeric(8, 4), default=20)
    raind10 = db.Column(db.Numeric(8, 4), default=20)
    raind11 = db.Column(db.Numeric(8, 4), default=20)
    raind12 = db.Column(db.Numeric(8, 4), default=20)
    frost1 = db.Column(db.Numeric(8, 4), default=0)
    frost2 = db.Column(db.Numeric(8, 4), default=0)
    frost3 = db.Column(db.Numeric(8, 4), default=0)
    frost4 = db.Column(db.Numeric(8, 4), default=0)
    frost5 = db.Column(db.Numeric(8, 4), default=0)
    frost6 = db.Column(db.Numeric(8, 4), default=0)
    frost7 = db.Column(db.Numeric(8, 4), default=0)
    frost8 = db.Column(db.Numeric(8, 4), default=0)
    frost9 = db.Column(db.Numeric(8, 4), default=0)
    frost10 = db.Column(db.Numeric(8, 4), default=0)
    frost11 = db.Column(db.Numeric(8, 4), default=0)
    frost12 = db.Column(db.Numeric(8, 4), default=0)

class SpeciesModel(db.Model):
    __tablename__ = "species"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    speciesname = db.Column(db.String(100), nullable=False)
    create_time = db.Column(db.Date, default=date.today())

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    creator = db.relationship("UserModel", backref='species')

    # 63个参数字段
    pFS2 = db.Column(db.Numeric(10, 4), default=1)
    pFS20 = db.Column(db.Numeric(10, 4), default=0.15)
    aS = db.Column(db.Numeric(10, 4), default=0.095)
    nS = db.Column(db.Numeric(10, 4), default=2.4)
    pRx = db.Column(db.Numeric(10, 4), default=0.8)
    pRn = db.Column(db.Numeric(10, 4), default=0.25)
    gammaFx = db.Column(db.Numeric(10, 4), default=0.027)
    gammaF0 = db.Column(db.Numeric(10, 4), default=0.001)
    tgammaF = db.Column(db.Numeric(10, 4), default=12)
    gammaR = db.Column(db.Numeric(10, 4), default=0.015)
    Tmin = db.Column(db.Numeric(10, 4), default=8.5)
    Topt = db.Column(db.Numeric(10, 4), default=16)
    Tmax = db.Column(db.Numeric(10, 4), default=40)
    kF = db.Column(db.Numeric(10, 4), default=0)
    SWconst = db.Column(db.Numeric(10, 4), default=0.7)
    SWpower = db.Column(db.Numeric(10, 4), default=9)
    fCalpha700 = db.Column(db.Numeric(10, 4), default=1.4)
    fCg700 = db.Column(db.Numeric(10, 4), default=0.7)
    m0 = db.Column(db.Numeric(10, 4), default=0)
    fN0 = db.Column(db.Numeric(10, 4), default=1)
    fNn = db.Column(db.Numeric(10, 4), default=0)
    MaxAge = db.Column(db.Numeric(10, 4), default=50)
    nAge = db.Column(db.Numeric(10, 4), default=4)
    rAge = db.Column(db.Numeric(10, 4), default=0.95)
    gammaNx = db.Column(db.Numeric(10, 4), default=0)
    gammaN0 = db.Column(db.Numeric(10, 4), default=0)
    tgammaN = db.Column(db.Numeric(10, 4), default=0)
    ngammaN = db.Column(db.Numeric(10, 4), default=1)
    wSx1000 = db.Column(db.Numeric(10, 4), default=300)
    thinPower = db.Column(db.Numeric(10, 4), default=1.5)
    mF = db.Column(db.Numeric(10, 4), default=0)
    mR = db.Column(db.Numeric(10, 4), default=0.2)
    mS = db.Column(db.Numeric(10, 4), default=0.2)
    SLA0 = db.Column(db.Numeric(10, 4), default=11)
    SLA1 = db.Column(db.Numeric(10, 4), default=4)
    tSLA = db.Column(db.Numeric(10, 4), default=2.5)
    k = db.Column(db.Numeric(10, 4), default=0.5)
    fullCanAge = db.Column(db.Numeric(10, 4), default=3)
    MaxIntcptn = db.Column(db.Numeric(10, 4), default=0.15)
    LAImaxIntcptn = db.Column(db.Numeric(10, 4), default=0)
    alpha = db.Column(db.Numeric(10, 4), default=0.06)
    Y = db.Column(db.Numeric(10, 4), default=0.47)
    MinCond = db.Column(db.Numeric(10, 4), default=0)
    MaxCond = db.Column(db.Numeric(10, 4), default=0.02)
    LAIgcx = db.Column(db.Numeric(10, 4), default=3.33)
    CoeffCond = db.Column(db.Numeric(10, 4), default=0.05)
    BLcond = db.Column(db.Numeric(10, 4), default=0.2)
    fracBB0 = db.Column(db.Numeric(10, 4), default=0.75)
    fracBB1 = db.Column(db.Numeric(10, 4), default=0.15)
    tBB = db.Column(db.Numeric(10, 4), default=2)
    rhoMin = db.Column(db.Numeric(10, 4), default=0.45)
    rhoMax = db.Column(db.Numeric(10, 4), default=0.45)
    tRho = db.Column(db.Numeric(10, 4), default=4)
    aH = db.Column(db.Numeric(10, 4), default=0)
    nHB = db.Column(db.Numeric(10, 4), default=0)
    nHN = db.Column(db.Numeric(10, 4), default=0)
    aV = db.Column(db.Numeric(10, 4), default=0)
    nVB = db.Column(db.Numeric(10, 4), default=0)
    nVN = db.Column(db.Numeric(10, 4), default=0)
    Qa = db.Column(db.Numeric(10, 4), default=-90)
    Qb = db.Column(db.Numeric(10, 4), default=0.8)
    gDM_mol = db.Column(db.Numeric(10, 4), default=24)
    molPAR_MJ = db.Column(db.Numeric(10, 4), default=2.3)
